package java8.xml.dom4j;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

/**
 * @author 周宇
 * @create 2020-08-28 17:11
 */
public class Dem4jDemo {
    private static Document doc;

    public static void main(String[] args) {
        //addInfo();
        //deleteInfo();
        updateInfo();
    }

    /**
     * 第一种解析xml方法
     */
    public static void test() {
        try {
            doc = getDocument("src/main/resources/xml/book.xml");
            //得到xml文件的根节点
            Element root = doc.getRootElement();
            System.out.print("根节点：" + root.getName());
            // 遍历子元素
            List<Element> elements = root.elements();
            System.out.println("\t子节点个数：" + elements.size());
            // 遍历
            for (Element element : elements) {
                String id = element.attributeValue("id");
                System.out.print("id：" + id);

                List<Element> elements2 = element.elements();
                System.out.println("\t子节点个数：" + elements2.size());
                for (Element element2 : elements2) {
                    System.out.println(element2.getTextTrim());
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 第二种解析xml方法
     */
    public static void test2() {
        try {
            doc = getDocument("src/main/resources/xml/book.xml");

            //得到xml文件的根节点
            Element root = doc.getRootElement();
            //按照元素的标签名得到该元素对应的节点集合
            List<Element> elements = root.elements("book");
            for (Element element : elements) {
                //通过属性名称得到对应的属性值
                System.out.println("id=" + element.attributeValue("id"));
                //通过元素标签名称得到对应的元素的文本信息
                System.out.println("title=" + element.elementText("title"));
                System.out.println("author=" + element.elementText("author"));
                System.out.println("price=" + element.elementText("price"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 新增XML元素
     */
    public static void addInfo() {
        //得到一个Document对象
        doc = getDocument("src/main/resources/xml/book.xml");
        //得到xml文件的根节点
        Element root = doc.getRootElement();
        //新增一个元素，元素的名称叫
        Element book = root.addElement("book");
        //在book元素里添加一个id属性，属性值103
        book.addAttribute("id", "103");
        //在book元素下再创建一个新的元素title
        Element title = book.addElement("title");
        title.addText("mysql 数据库优化");
        Element author = book.addElement("author");
        author.addText("王五");
        Element price = book.addElement("price");
        price.addText("58");

        //保存XML的功能
        saveXML("src/main/resources/xml/newBook.xml");
        System.out.println("添加成功");
    }

    /**
     * 删除XML元素
     */
    public static void deleteInfo() {
        //得到一个Document对象
        doc = getDocument("src/main/resources/xml/newBook.xml");
        //得到xml文件的根节点
        Element root = doc.getRootElement();
        List<Element> elements = root.elements("book");
        for (Element element : elements) {
            String id = element.attributeValue("id");
            //找到要删除的元素，我要删除103
            if (id.equals("103")) {
                //删除 从当前元素的父节点中把该元素移除
                Element parent = element.getParent();
                parent.remove(element);
                break;
            }
        }
        saveXML("src/main/resources/xml/newBook.xml");
        System.out.println("删除成功");
    }

    /**
     * 修改XML元素
     */
    public static void updateInfo() {
        //得到一个Document对象
        doc = getDocument("src/main/resources/xml/newBook.xml");
        //得到xml文件的根节点
        Element root = doc.getRootElement();
        List<Element> elements = root.elements("book");
        for (Element element : elements) {
            String id = element.attributeValue("id");
            //找到要修改的元素
            if (id.equals("102")) {
                Element price = element.element("price");
                price.setText("18");
                break;
            }
        }
        saveXML("src/main/resources/xml/newBook.xml");
        System.out.println("修改成功");
    }

    /**
     * 保存XML文件
     */
    public static void saveXML(String filePath) {
        try {
            //美化格式
            OutputFormat format = OutputFormat.createPrettyPrint();
            //缩减格式
            //OutputFormat format = OutputFormat.createCompactFormat();
            // 设置xml文件的字符编码格式
            format.setEncoding("UTF-8");
            XMLWriter writer = new XMLWriter(new FileWriter(filePath), format);
            writer.write(doc);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 得到Document对象
     */
    public static Document getDocument(String path) {
        Document doc = null;
        try {
            //创建一个SAXReader管道，读取配置文件
            SAXReader reader = new SAXReader();
            //创建一个File类
            File file = new File(path);
            //读取xml文件，返回Document对象
            doc = reader.read(file);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return doc;
    }
}
